package cn.iocoder.yudao.module.javainfo.service.financialflow;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.javainfo.controller.admin.financialflow.vo.*;
import cn.iocoder.yudao.module.javainfo.dal.dataobject.financialflow.FinancialFlowDO;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 资金流水 Service 接口
 *
 * @author 爪哇国大BOSS
 */
public interface FinancialFlowService {

    /**
     * 创建资金流水
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createFinancialFlow(@Valid FinancialFlowSaveReqVO createReqVO);

    /**
     * 更新资金流水
     *
     * @param updateReqVO 更新信息
     */
    void updateFinancialFlow(@Valid FinancialFlowSaveReqVO updateReqVO);

    /**
     * 删除资金流水
     *
     * @param id 编号
     */
    void deleteFinancialFlow(Long id);

    /**
    * 批量删除资金流水
    *
    * @param ids 编号
    */
    void deleteFinancialFlowListByIds(List<Long> ids);

    /**
     * 获得资金流水
     *
     * @param id 编号
     * @return 资金流水
     */
    FinancialFlowDO getFinancialFlow(Long id);

    /**
     * 获得资金流水分页
     *
     * @param pageReqVO 分页查询
     * @return 资金流水分页
     */
    PageResult<FinancialFlowDO> getFinancialFlowPage(FinancialFlowPageReqVO pageReqVO);

    Map<Long, String> getUserBalanceMap(List<Long> userIds);

    /**
     * 获取最近x天每天的资金流水统计
     *
     * @param days 天数
     * @param amountType 金额类型
     * @return 每日统计列表
     */
    List<FinancialFlowDailyStatisticsRespVO> getDailyStatistics(Integer days, String amountType);

    /**
     * 获取最近x天用户资金流水排行榜
     *
     * @param days 天数
     * @param amountType 金额类型
     * @param limit 限制数量
     * @return 用户排行榜
     */
    List<FinancialFlowUserRankRespVO> getUserRank(Integer days, String amountType, Integer limit);

    /**
     * 获取用户消费统计（近一年）
     *
     * @param userId 用户ID
     * @return 用户消费统计
     */
    UserConsumptionStatsRespVO getUserConsumptionStats(Long userId);
}